package Server;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;

import Bibl.BibliotekaPOA;
import Bibl.Ksiazka;
import Bibl.Osoba;
import Bibl.BibliotekaPackage.BrakIndeksuCzytelnikaException;
import Bibl.BibliotekaPackage.BrakIndeksuKsiazkiException;
import Bibl.BibliotekaPackage.KsiazkaWypozyczonaException;
import Bibl.BibliotekaPackage.KsiazkaZarezerwowanaException;

public class BibliotekaImpl extends BibliotekaPOA
    {
    
    private Connection _con;
    
    public BibliotekaImpl(PolaczenieBazyDanych connection) throws Exception
        {
        _con = connection.getConnection();
        }

    public void dodajCzytelnika( Osoba czytelnik )
        {
        try
            {
            String SQL = "INSERT INTO Osoby (Imie,Nazwisko,Adres) VALUES( '" +
                czytelnik.imie + "', '" + czytelnik.nazwisko + "', '" + czytelnik.adres + "' );";
            System.out.println( SQL );
            Statement stmt = _con.createStatement();
            stmt.execute( SQL );
            }
        catch( SQLException e )
            {
            e.printStackTrace();
            }
        }

    public void dodajKsiazke( Ksiazka ksiazka )
        {
        try
            {
            String SQL = "INSERT INTO Ksiazki " + 
            "(Autor,Tytul,Wydawnictwo,RokWydania,Status,DataZwrotu,IndeksCzytelnika) VALUES( '" +
                ksiazka.autor + "', '" 
                + ksiazka.tytul + "', '" + 
                ksiazka.wydawnictwo + "', '" +
                ksiazka.rokWydania + "', " +
                ksiazka.status +
                ", '', '' );";
            System.out.println( SQL );
            Statement stmt = _con.createStatement();
            stmt.execute( SQL );
            }
        catch( SQLException e )
            {
            e.printStackTrace();
            }
        }

    public void oddajKsiazke( String indeksKsiazki ) throws BrakIndeksuKsiazkiException
        {
        try
            {
            String SQLQuery = "SELECT Status FROM Ksiazki WHERE Indeks = " + indeksKsiazki + ";";
            Statement s1 = _con.createStatement();
            ResultSet rs = s1.executeQuery( SQLQuery );
            int status = -1;
           
            if( rs.next() )
                status = rs.getInt( "Status" );
            
            if( status == -1 )
                throw new BrakIndeksuKsiazkiException();
            else if( status != 1)
                System.out.println( "Ksiazka nie jest wypozyczona!" );
            String SQL = "UPDATE Ksiazki SET Status=0, " +
            "DataZwrotu='" + new Date().toString() + "', " + 
            "IndeksCzytelnika=0" + 
            " WHERE Indeks=" + indeksKsiazki + ";";
            System.out.println( SQL );
            Statement stmt = _con.createStatement();
            stmt.execute( SQL );
            }
        catch( SQLException e )
            {
            e.printStackTrace();
            }
        }

    public void rezerwujKsiazke( String indeksKsiazki, String indeksCzytelnika ) throws KsiazkaZarezerwowanaException, KsiazkaWypozyczonaException
        {
        String indeksOsoby = "1";
        //String dataZwrotu = "2007-04-20";
        try
            {
            String SQLQuery = "SELECT Status FROM Ksiazki WHERE Indeks = " + indeksKsiazki + ";";
            Statement s1 = _con.createStatement();
            ResultSet rs = s1.executeQuery( SQLQuery );
            int status = -1;
           
            if( rs.next() )
                status = rs.getInt( "Status" );
            
            if( status == -1 )
                System.out.println( "Ksiazka nie znaleziona!" );
            else if( status == 1)
                    throw new KsiazkaZarezerwowanaException();
            else if( status == 2)
                throw new KsiazkaWypozyczonaException();
            String SQL = "UPDATE Ksiazki SET Status=1, " +
            "IndeksCzytelnika='" + indeksOsoby + "' " + 
            " WHERE Indeks=" + indeksKsiazki + ";";
            System.out.println( SQL );
            Statement stmt = _con.createStatement();
            stmt.execute( SQL );
            }
        catch( SQLException e )
            {
            e.printStackTrace();
            }
        }

    public void usunCzytelnika( String indeksCzytelnika ) throws BrakIndeksuCzytelnikaException
        {
        try
            {
            String SQL = "DELETE FROM Osoby WHERE Indeks=" + 
                indeksCzytelnika + ";";
            System.out.println( SQL );
            Statement stmt = _con.createStatement();
            stmt.execute( SQL );
            }
        catch( SQLException e )
            {
            throw new BrakIndeksuCzytelnikaException();
            }
        }

    public void usunKsiazke( String indeksKsiazki ) throws BrakIndeksuKsiazkiException
        {
        try
            {
            String SQL = "DELETE FROM Ksiazki WHERE Indeks=" + 
                indeksKsiazki + ";";
            System.out.println( SQL );
            Statement stmt = _con.createStatement();
            stmt.execute( SQL );
            }
        catch( SQLException e )
            {
            throw new BrakIndeksuKsiazkiException();
            }
        }

    public void wypozyczKsiazke( String indeksKsiazki, String indeksCzytelnika, String dataZwrotu) throws KsiazkaZarezerwowanaException, KsiazkaWypozyczonaException
        {
        try
            {
            String SQLQuery = "SELECT Status, IndeksCzytelnika FROM Ksiazki WHERE Indeks = " + indeksKsiazki + ";";
            Statement s1 = _con.createStatement();
            ResultSet rs = s1.executeQuery( SQLQuery );
            int status = -1;
            String czytelnik = "";
           
            if( rs.next() )
                {
                status = rs.getInt( "Status" );
                czytelnik =  rs.getString( "IndeksCzytelnika" );
                }
            
            if( status == -1 )
                System.out.println( "Ksiazka nie znaleziona!" );
            else if( status == 1 && czytelnik.compareTo( indeksCzytelnika )!=0 )
                    throw new KsiazkaZarezerwowanaException();
            else if( status == 2)
                throw new KsiazkaWypozyczonaException();
            String SQL = "UPDATE Ksiazki SET Status=2, " +
            "DataZwrotu='" + dataZwrotu + "', " + 
            "IndeksCzytelnika='" + indeksCzytelnika + "' " + 
            " WHERE Indeks=" + indeksKsiazki + ";";
            System.out.println( SQL );
            Statement stmt = _con.createStatement();
            stmt.execute( SQL );
            }
        catch( Exception e )
            {
            e.printStackTrace();
            }
        }

    public Osoba[] wyszukajCzytelnika( Osoba czytelnik )
        {
        java.util.LinkedList<String> warunki = 
            new java.util.LinkedList<String>();
        
        java.util.LinkedList<Osoba> wynik = 
        new java.util.LinkedList<Osoba>();
        
        if( czytelnik.adres != null && czytelnik.adres.compareTo( "" ) != 0 )
            warunki.add( "Adres LIKE '%" + czytelnik.adres + "%'" );
        
        if( czytelnik.imie != null && czytelnik.imie.compareTo( "" ) != 0 )
            warunki.add( "Imie LIKE '%" + czytelnik.imie + "%'" );
        
        if( czytelnik.nazwisko != null && czytelnik.nazwisko.compareTo( "" ) != 0  )
            warunki.add( "Nazwisko LIKE '%" + czytelnik.nazwisko + "%'" );
        
        if( czytelnik.indeks != null && czytelnik.indeks.compareTo( "" ) != 0  )
            warunki.add( "Indeks=" + czytelnik.indeks + "" );
        
        StringBuilder query = new StringBuilder();
        query.append( "SELECT * FROM Osoby");
        if( !warunki.isEmpty())
            {
            query.append( " WHERE" );
            boolean first = true;
            for( String s:warunki)
                {
                if( !first )
                    query.append( " AND" );
                query.append( " " );
                query.append( s );
                first = false;
                }
            }
        
        query.append( ";" );
        System.out.println( query.toString() );
        try
            {
            Statement stmt = _con.createStatement();
            ResultSet rs = stmt.executeQuery( query.toString() );
            while( rs.next())
                {
                String imie = rs.getString( "Imie" );
                String nazwisko = rs.getString( "Nazwisko" );
                String adres = rs.getString( "Adres" );
                int indeks = rs.getInt( "Indeks" );
                
                Osoba o = new Osoba(imie, nazwisko,adres,""+indeks,"haslo" );
                wynik.add( o );
                }
            return wynik.toArray(new Osoba[ 0 ]);
            }
        catch( Exception e)
            {
            e.printStackTrace();
            return null;
            }
        }

    public Ksiazka[] wyszukajKsiazke( Ksiazka ksiazka )
        {
        java.util.LinkedList<String> warunki = 
            new java.util.LinkedList<String>();
    
        java.util.LinkedList<Ksiazka> wynik = 
            new java.util.LinkedList<Ksiazka>();
        
        if( ksiazka.autor != null && ksiazka.autor.compareTo( "" )!=0 )
            warunki.add( "Autor LIKE '%" + ksiazka.autor + "%'" );
        
        if( ksiazka.tytul  != null && ksiazka.tytul.compareTo( "" )!=0 )
            warunki.add( "Tytul LIKE '%" + ksiazka.tytul + "%'" );
        
        if( ksiazka.rokWydania  != null && ksiazka.rokWydania.compareTo( "" )!=0 )
            warunki.add( "RokWydania='" + ksiazka.rokWydania + "'" );
        
        if( ksiazka.wydawnictwo  != null && ksiazka.wydawnictwo.compareTo( "" )!=0 )
            warunki.add( "Wydawnictwo LIKE '%" + ksiazka.wydawnictwo + "%'" );
        
        if( ksiazka.indeksCzytelnika  != null && ksiazka.indeksCzytelnika.compareTo( "" )!=0 )
            warunki.add( "IndeksCzytelnika=" + ksiazka.indeksCzytelnika + "" );
        
        if( ksiazka.dataZwrotu  != null && ksiazka.dataZwrotu.compareTo( "" )!=0 )
            warunki.add( "DataZwrotu='" + ksiazka.dataZwrotu+ "'" );
        
        if( ksiazka.indeks  != null && ksiazka.indeks.compareTo( "" )!=0)
            warunki.add( "Indeks=" + ksiazka.indeks + "" );
        
        StringBuilder query = new StringBuilder();
        query.append( "SELECT * FROM Ksiazki");
        if( !warunki.isEmpty())
            {
            query.append( " WHERE" );
            boolean first = true;
            for( String s:warunki)
                {
                if( !first )
                    query.append( " AND" );
                query.append( " " );
                query.append( s );
                first = false;
                }
            }
        
        
        query.append( ";" );
        System.out.println( query.toString() );
        
        try
            {
            Statement stmt = _con.createStatement();
            ResultSet rs = stmt.executeQuery( query.toString() );
            while( rs.next())
                {
                String tytul = rs.getString( "Tytul" );
                String autor = rs.getString( "Autor" );
                String wydawnictwo = rs.getString( "Wydawnictwo" );
                String rokWydania = rs.getString( "RokWydania" );
                String indeksCzytelnika = rs.getString( "IndeksCzytelnika" );
                String dataZwrotu = rs.getString( "DataZwrotu" );
                int status = rs.getInt( "Status" );
                int indeks = rs.getInt( "Indeks" );
                
                Ksiazka k = new Ksiazka(autor,tytul,wydawnictwo,rokWydania,(short)status,dataZwrotu,indeksCzytelnika,""+indeks);
                wynik.add( k );
                }
            return wynik.toArray(new Ksiazka[ 0 ]);
            }
        catch( Exception e)
            {
            e.printStackTrace();
            return null;
            }
        }

    }
